From a44d6816d3c20748deefa45a0c3b5ace146e4540 Mon Sep 17 00:00:00 2001 From: Cosimo Cecchi Date: Mon, 22 Apr 2013 16:50:39 -0400 Subject: [PATCH] cssshadow: add a method to get the size of a shadows value The method returns the size of each side of a GtkCssShadowsValue. --- gtk/gtkcssshadowsvalue.c | 34 +++++++++++++++++++++++++++++++++ gtk/gtkcssshadowsvalueprivate.h | 3 +++ gtk/gtkcssshadowvalue.c | 20 +++++++++++++++++++ gtk/gtkcssshadowvalueprivate.h | 6 ++++++ 4 files changed, 63 insertions(+) diff --git a/gtk/gtkcssshadowsvalue.c b/gtk/gtkcssshadowsvalue.c index a71f4fe08f..324949176a 100644 --- a/gtk/gtkcssshadowsvalue.c +++ b/gtk/gtkcssshadowsvalue.c @@ -300,3 +300,37 @@ _gtk_css_shadows_value_paint_box (const GtkCssValue *shadows, _gtk_css_shadow_value_paint_box (shadows->values[i], cr, padding_box); } } + +void +_gtk_css_shadows_value_get_extents (const GtkCssValue *shadows, + GtkBorder *border) +{ + guint i; + GtkBorder b = { 0 }; + const GtkCssValue *shadow; + gdouble hoffset, voffset, spread, radius; + + g_return_if_fail (shadows->class == >K_CSS_VALUE_SHADOWS); + + for (i = 0; i < shadows->len; i++) + { + shadow = shadows->values[i]; + + if (_gtk_css_shadow_value_get_inset (shadow)) + continue; + + _gtk_css_shadow_value_get_geometry (shadow, + &hoffset, &voffset, + &radius, &spread); + + b.top = MAX (0, radius + spread - voffset); + b.right = MAX (0, radius + spread + hoffset); + b.bottom = MAX (0, radius + spread + voffset); + b.left = MAX (0, radius + spread - hoffset); + + border->top = MAX (border->top, b.top); + border->right = MAX (border->right, b.right); + border->bottom = MAX (border->bottom, b.bottom); + border->left = MAX (border->left, b.left); + } +} diff --git a/gtk/gtkcssshadowsvalueprivate.h b/gtk/gtkcssshadowsvalueprivate.h index 7ee619e8de..2b227bd5a8 100644 --- a/gtk/gtkcssshadowsvalueprivate.h +++ b/gtk/gtkcssshadowsvalueprivate.h @@ -49,6 +49,9 @@ void _gtk_css_shadows_value_paint_box (const GtkCssValue const GtkRoundedBox *padding_box, gboolean inset); +void _gtk_css_shadows_value_get_extents (const GtkCssValue *shadows, + GtkBorder *border); + G_END_DECLS #endif /* __GTK_CSS_SHADOWS_VALUE_H__ */ diff --git a/gtk/gtkcssshadowvalue.c b/gtk/gtkcssshadowvalue.c index 6e61cab426..4e7ca65d26 100644 --- a/gtk/gtkcssshadowvalue.c +++ b/gtk/gtkcssshadowvalue.c @@ -453,6 +453,26 @@ _gtk_css_shadow_value_get_inset (const GtkCssValue *shadow) return shadow->inset; } +void +_gtk_css_shadow_value_get_geometry (const GtkCssValue *shadow, + gdouble *hoffset, + gdouble *voffset, + gdouble *radius, + gdouble *spread) +{ + g_return_if_fail (shadow->class == >K_CSS_VALUE_SHADOW); + + if (hoffset != NULL) + *hoffset = _gtk_css_number_value_get (shadow->hoffset, 0); + if (voffset != NULL) + *voffset = _gtk_css_number_value_get (shadow->voffset, 0); + + if (radius != NULL) + *radius = _gtk_css_number_value_get (shadow->radius, 0); + if (spread != NULL) + *spread = _gtk_css_number_value_get (shadow->spread, 0); +} + void _gtk_css_shadow_value_paint_box (const GtkCssValue *shadow, cairo_t *cr, diff --git a/gtk/gtkcssshadowvalueprivate.h b/gtk/gtkcssshadowvalueprivate.h index 0688fc3301..e46b303631 100644 --- a/gtk/gtkcssshadowvalueprivate.h +++ b/gtk/gtkcssshadowvalueprivate.h @@ -36,6 +36,12 @@ GtkCssValue * _gtk_css_shadow_value_parse (GtkCssParser gboolean _gtk_css_shadow_value_get_inset (const GtkCssValue *shadow); +void _gtk_css_shadow_value_get_geometry (const GtkCssValue *shadow, + gdouble *hoffset, + gdouble *voffset, + gdouble *radius, + gdouble *spread); + void _gtk_css_shadow_value_paint_layout (const GtkCssValue *shadow, cairo_t *cr, PangoLayout *layout); -- 2.30.2